package model;

import java.util.ArrayList;

//hangyaszsun tipusu objektumok osztalya

public class HedgeHog extends GameObject{
	//alszik-e a sun
	private boolean isActive;
	//mennyi hangyat evett meg
	public int antsEaten;
	//mennyi hangya bele a gyomraba
	private int capacity;
	//iranyvektor x koord.
	protected double dir_x;
	//iranyvektor y koord.
	protected double dir_y;
	//sebesseg
	//hangyaszsun mozgasi iranya fokban
	protected int speed;
	private double dir;
	//hangyaszsun harapokore
	protected double range;
	
	
	public HedgeHog(Game currgame){
		super(currgame,"HedgeHog");
		//3 hangya fer el a bendojebe
		capacity=10;
		range=5;
		//hangyaszsun default jobbra megy
		dir=0;
		dir_x=1;
		dir_y=0;
		speed=8;
		
		
	}
	
	//hangyaszsun mozgasfuggvenye
	public void move() {
		if(isActive){
			ArrayList<Lake> lakes=new ArrayList<Lake>(); //kikerulendo akadalyok listaja
			ArrayList<AntOdor> odors=new ArrayList<AntOdor>(); //szagok listaja
			ArrayList<Ant> ants=new ArrayList<Ant>(); //hangyak listaja
			ArrayList<Rock> rocks=new ArrayList<Rock>();
			
			//listak feltoltese
			for(MapElement m: game.currentMap.mapelements){
				if(m.getType().equals("lake"))
					lakes.add((Lake) m);
				if(m.getType().equals("Rock"))
					rocks.add((Rock) m);
			}
			
			for (GameObject g: game.gameObjects){
				if(g.getType().toLowerCase().contains("odor"))
					odors.add((AntOdor) g);
				if(g.getType().toLowerCase().contains("bigant") || g.getType().toLowerCase().contains("littleant"))
					ants.add((Ant) g);
			}
			//palya szelevel valo utkozes
			if(loc_x<=0){
				turn(90);
				loc_x=11;
			}
			if(loc_y<=0){
				turn(90);
				loc_y=11;
			}
			if(loc_x>=600){
				turn(90);
				loc_x=589;
			}
			if(loc_y>=600){
				turn(90);
				loc_y=589;
			}
			
			
			//ha hangyakkal talalkozik, akkor megeszi oket
			for(Ant a: ants){
				if(a.collision(this)){
					eatant();
					a.killAnt();
				}
			}
			
			
			//ha toval utkozunk, akkor 90 fok fordulas jobbra, majd tovabbhaladas
				for(Lake l: lakes){
					if(l.collision(this)){
						turn(90);
						loc_x=loc_x+dir_x*speed;
						loc_y=loc_y+dir_y*speed;
						return;
					}
				}
				
				for(Rock r: rocks){
					if(r.collision(this)){
		
						if(r.move(this, lakes, rocks)){
							loc_x=loc_x+dir_x*speed;
							loc_y=loc_y+dir_y*speed;
							return;
						}
						else{
							turn(45);
							loc_x=loc_x+dir_x*speed;
							loc_y=loc_y+dir_y*speed;
							return;
						}							
						
					}
				}
				
				//ha engedelyezve van a random mukodes:
				float odorstrenght=0;
				//erzi-e a hangya mas hangyanak a szagat
				for(AntOdor o: odors){
					if(this.loc_x+this.range>o.loc_x-o.range && this.loc_x-this.range<o.loc_x+o.range
							&& this.loc_y+this.range>o.loc_y-o.range && this.loc_y-this.range<o.loc_y+o.range){
						//a legerosebb szag iranyaba forulunk
						if(o.range>odorstrenght){
							odorstrenght=o.range;
							double templocx=loc_x-o.loc_x;
							double templocy=loc_y-o.loc_y;
							double lenght=Math.sqrt(templocx*templocx+templocy*templocy);
							templocx/=lenght;
							templocy/=lenght;
							dir_x=templocx;
							dir_y=templocy;
							dir=this.convertDirToAngle(dir_x, dir_y);				
						}
					}
				}
				
				//ha ereztunk hangyaszagot akkor afele megyunk
				if(odorstrenght>0){
					loc_x=loc_x+dir_x*speed*-1;
					loc_y=loc_y+dir_y*speed*-1;
					return;
				}
				//ha nem akkkor elore, vagy kis valoszinuseggel elfordulunk
				else{
					
					if(Math.random()>=0.95) turn(20);
					loc_x=loc_x+dir_x*speed;
					loc_y=loc_y+dir_y*speed;
					return;
				}
				
				
		}
		
	}
	
	//hangyaszsun aktivitas getter/setter metodusok
	public boolean isActive() {
		return isActive;
	}

	public void setActive(boolean isActive) {
		this.isActive = isActive;
	}

	//hangyaszsun elforditasa deg fokkal
	@Override
	public void turn(double deg){
		if(!isActive)return;
		
		dir=dir+deg;
		if(dir>=360)dir-=360;
		dir_x=Math.cos((dir*2*Math.PI)/360)*-1;
		dir_y=Math.sin((dir*2*Math.PI)/360)*-1;

	}
	
	//hangyaszsun megeszik egy hangyat
	public void eatant(){
		antsEaten++;
		//ha tele lett a bendoje, akkor elalszik
		if(antsEaten>=capacity)
			isActive=false;
	}
	
}
